/* eraq - conditional file erase program (with query)
	The default fcb (from the command line) is used to search for
	matching files and each match is printed on the console for 
	delete confirmation.  A table is built of files to be deleted
	so as to not lose the search position in the directory.
	The maximum number of fcbs in the table is given by LIST_LNGTH
	below, if this number is exceeded or free space exhausted the
	table entries are deleted and the search restarted. */

	eraq: procedure options(main);
	%replace
	   TRUE           by '1'b,
	   FALSE          by '0'b,
	   VERSION        by 'ERAQ 1.0',
	   VERDATE        by '02/05/81',
	   HELP_CMD       by 'HELP    ',
	   EOF            by '^Z',
	   INTRRPT        by '^C',
	   LIST_LNGTH     by 512;

	%include 'diomod.dcl';

	declare
	   version_date   char(8) external static init(VERDATE);
	

	declare
	   1 default1      based(dfcb0()),
	     3 space       fixed(7),
	     3 command     char(8);

	declare
	   fcbp            pointer,
	   1 dir_fcb       based(fcbp),
	     3 drive       fixed(7),
	     3 fname       char(8),
	     3 ftype       char(3),
	     3 fext        fixed(7);

	declare
	   1 del_fcb       based,
	     3 dr          fixed(7),
	     3 fn          char(8),
	     3 ft          char(3),
	     3 fe          fixed(7);

	declare
	   1 default_fcb   based(dfcb0()),
	     3 spacer      bit(8),
	     3 name        char(11);

	declare
	   delp(LIST_LNGTH) pointer,
	   drv              bin fixed(7) based(dfcb0()),
	   dir_mask(0:127)  bit(8) based(dbuff()),
	   (i,n)            bin fixed static init(0);

	on error(7) begin;
	   n = n - 1;
	   put skip list('List space exhausted');
	   call delete_list;
	      do i = 1 to n;
	      free delp(i)->del_fcb;
	      end;
	   n = 0;
	   go to redo;
	   end;

	put list(VERSION);
	if command = HELP_CMD then do;
	    put skip list('ERAQ - Erase with Query');
	    put skip(2) list('Command line:');
	    put list('		ERAQ <ambiguous filename>');
	    put skip(2);
	    call reboot();
	    end;

redo:
	PUT SKIP;
	if index(default_fcb.name,'?') = 0 then do;
	   call delete(dfcb0());
	   end;
	else do;
	   call setdma(dbuff());
	   i = sear(dfcb0());
	   if i > -1 then do;
	         do while(i > -1);
	         unspec(i) = unspec(i) & '00000011'b;  /* for CP/M 1.4 */
	         fcbp = addr(dir_mask(i * 32));
	         if drive = user() then do;
	            drive = drv;
	            if query() then
	               call add_to_list;
	            i = searn();
	            end;
	         end;
	      call delete_list;
	      end;
	   else
	      put skip list('File not found');
	   end;
	call reboot();

/* user - procedure to get user number if version > = cp/m 2.0 */
	user: procedure returns(fixed(7));

	if vers() = '0000'b4 then
	   return(0);
	else
	   return(getusr());
	end user;

/* add_to_list - add fcb to delete list */
	add_to_list: procedure;

	n = n + 1;
	if n > LIST_LNGTH then
	   signal error(7);
	allocate del_fcb set(delp(n));
	delp(n)->del_fcb = dir_fcb;
	end add_to_list;


/* delete_list - delete fcbs in delete list */
	delete_list: procedure;

	put skip list('Deleting: ');
	   do i = 1 to n;
	   put list('.');
	   call delete(delp(i));
	   call abort_test;
	   end;
	put skip list(n,'file(s) deleted');
	end delete_list;

/* query - query and delete if response is 'y'es */
	query: procedure returns(bit(1));
	declare
	   c              char(1);

	put skip;
	if drive > 0 then
	   put list(ascii(64+drive)||':');
	put list(fname||'.'||ftype,'?');
	c = rdcon();
	if c = EOF then do;
	   call delete_list;
	   call reboot();
	   end;
	else if c = INTRRPT then
	   call reboot();
	else if translate(c,'Y','y') = 'Y' then
	   return(TRUE);
	else
	   return(FALSE);
	end query;

/* abort_test - abort if console character */
	abort_test: procedure;
	dcl c char(1);

                if break() then do;
		   c = rdcon();
		   put skip list('Abort (Y/N)? ');
		   c = rdcon();
		   if c = 'Y' | c ='y' then do;
                       put skip list('Aborted');
                       call reboot();
		       end;	
                   end;
	end abort_test;
        
	end eraq;
